/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.model.dao.orm.SesionImpl;
import com.model.domain.enaho.reporte.ListadosReporte;
import com.model.domain.enaho.reporte.MonitoreoPorViviendas;
import com.model.domain.enaho.reporte.ReporteRecojoDatosResumen;
import com.model.domain.ubicacion.GrupoViviendasReporte;
import com.model.domain.persona.Hogar;
import com.model.domain.tiempo.Mes;
import com.model.domain.tiempo.Periodo;
import com.model.domain.ubicacion.CentroPoblado;
import com.model.domain.ubicacion.Conglomerado;
import com.model.domain.ubicacion.CoordenadaGeografica;
import com.model.domain.ubicacion.Odei;
import com.model.domain.ubicacion.Vivienda;
import com.model.domain.ubicacion.ViviendaMarco;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import util.www.sql.WhereSql;
import util.www.sql.WhereSqlDinamico;
import util.www.sql.WhereSqlDinamicoCond;

/**
 *
 * @author Rdelacruz
 */
public class ViviendaMarcoService 
extends AbstractService
{  
    private ViviendaService viviendaService;
    private HogarService hogarService;
    
    public void procesarParte1(
            Connection con,
            Conglomerado filtro,
            ReporteRecojoDatosResumen rep,
            ListadosReporte listados ) throws Exception {
        
        //List<ViviendaReporte> lista = new ArrayList<>();
        
        //----------------------------------------------------------
        //2.1 FILA: NACIONAL
        GrupoViviendasReporte objTotal = new GrupoViviendasReporte();
        
        Odei odeiTotal = new Odei();
        //odeiTotal.setId("99");
        //odeiTotal.setNombre("NACIONAL");        
        odeiTotal.setNombre("(TOTAL)");
                
        Mes mesTotal = new Mes();
        mesTotal.setNombre("(TOTAL)");
        
        Periodo periodoTotal = new Periodo();
        periodoTotal.setNombre("(TOTAL)");
        
        Conglomerado cTotal = new Conglomerado();        
        cTotal.setOdei(odeiTotal);
        cTotal.setMes(mesTotal);
        cTotal.setPeriodo(periodoTotal);
        
        objTotal.setConglomerado(cTotal);        
        
        rep.addFilaTotal(objTotal);
        
        //----------------------------------------------------------
        
        //Filtro: Odei,Mes,Periodo
        WhereSqlDinamicoCond wsql = new WhereSqlDinamicoCond();
        wsql.agregarString("C.Odei",filtro.getOdei().getCodigo());
        wsql.agregarString("C.Mes",filtro.getMes().getCodigo());
        wsql.agregarString("C.Periodo",filtro.getPeriodo().getCodigo());
        wsql.agregarString("VM.Conglome",filtro.getCodigo());        
        String sqlWhere = wsql.getAnd();
        
        //2.2 RESTO DE FILAS
        Statement st = null;
        try {                        
            st = con.createStatement();            
            
            String sql = 
                    "select C.Odei, C.Mes, C.Periodo \n" +
",COUNT(VM.Vivienda) as nViviendasMarco\n" +
",MAX(V1.nViviendasCampo) as nViviendasCampo\n" +
",MAX(V2.nViviendasReemplazables) as nViviendasReemplazables\n" +
",MAX(V1.nHogaresDeclarados) as nHogaresDeclarados\n" +
"from (select Conglome,Vivienda from Campo_Vivienda_Marco where TipoVivienda in(1,4)) VM \n" +
"inner join Campo_Conglomerado C \n" +
"	on VM.Conglome = C.Conglome\n" +
"left join\n" +
"	(select C.Odei, C.Mes, C.Periodo \n" +
"	,COUNT(V.Vivienda) as nViviendasCampo\n" +
"	,SUM(CONVERT(INT,V.NroHogares)) as nHogaresDeclarados\n" +
"	from (SELECT Conglome,Vivienda,NroHogares FROM Campo_Vivienda WHERE TipoVivienda in (1,4) ) V \n" +
"	inner join Campo_Conglomerado C \n" +
"		on V.Conglome = C.Conglome\n" +
"	group by C.Odei, C.Mes, C.Periodo) V1\n" +
"	on C.Odei=V1.Odei and C.Mes=V1.Mes and C.Periodo=V1.Periodo	\n" +
"left join\n" +
"	(select C.Odei, C.Mes, C.Periodo \n" +
"	,COUNT(V.Vivienda) as nViviendasReemplazables\n" +
"	from Campo_Vivienda V \n" +
"	inner join Campo_Conglomerado C \n" +
"		on V.Conglome = C.Conglome\n" +
"	where V.TipoVivienda in(1,4)\n" +
"	and exists (SELECT Conglome,Vivienda FROM Campo_Hogar H WHERE ResFin IN (5,7) and V.Conglome=H.Conglome and V.Vivienda=H.Vivienda)\n" +
"	group by C.Odei, C.Mes, C.Periodo) V2\n" +
"	on C.Odei=V2.Odei and C.Mes=V2.Mes and C.Periodo=V2.Periodo	\n" +
                    sqlWhere+
"group by C.Odei, C.Mes, C.Periodo\n" +
"order by C.Odei, C.Mes, C.Periodo	\n" +
";";
            
            ResultSet rs = st.executeQuery(sql);            
            while(rs.next()) {
                GrupoViviendasReporte fila = new GrupoViviendasReporte();
                
                Conglomerado c = new Conglomerado();
                
                //ODEI
                Odei odei = listados.getOdei(rs.getString(1));                                               
                c.setOdei(odei);
                
                //MES
                Mes mes = listados.getMes(rs.getString(2));                
                c.setMes(mes);
                
                //PERIODO
                Periodo periodo = listados.getPeriodo(rs.getString(3));
                c.setPeriodo(periodo);
                                
                fila.setConglomerado(c);                
                
                fila.setnViviendasMarco( rs.getInt(4) ) ;
                fila.setnViviendasCampo( rs.getInt(5) ) ;
                fila.setnViviendasReemplazables( rs.getInt(6) );
                fila.setnHogaresDeclarados( rs.getInt(7) );
                
                rep.addFila(fila); 
                
                //SUMANDO los datos recien asignados
                objTotal.addNumeroViviendasMarco(fila.getnViviendasMarco());
                objTotal.addNumeroViviendasCampo(fila.getnViviendasCampo());                
                objTotal.addNumeroViviendasReemplazables(fila.getnViviendasReemplazables());
                objTotal.addNumeroHogaresDeclarados(fila.getnHogaresDeclarados());
            }
        }
        finally {
            if(st!=null) st.close();
        }
    }
   
    void procesar(Connection con, MonitoreoPorViviendas rep, Vivienda filtro, ListadosReporte listados) throws Exception {
        
        Statement st = null;
        try {                        
            st = con.createStatement();
            
            //Filtro: Odei, Mes, Periodo, Conglomerado
            WhereSqlDinamicoCond wsql = new WhereSqlDinamicoCond();
            Conglomerado cFiltro = filtro.getConglomerado();
            wsql.agregarString("C.Odei",cFiltro.getOdei().getCodigo());
            wsql.agregarString("C.Mes",cFiltro.getMes().getCodigo());
            wsql.agregarString("C.Periodo",cFiltro.getPeriodo().getCodigo());
            wsql.agregarString("VM.Conglome",cFiltro.getCodigo());
            String sqlWhere = wsql.getAnd();
                       
            
            String sql =
                    "select \n" +
"C.Odei, C.Mes, C.Periodo, C.Conglome, \n" +
"VM.NomCCPP, VM.Vivienda,\n" +
"V.EsReemplazo, V.NroReemplazo,\n" +
"HOG.rh_1, HOG.rh_2, HOG.rh_3, HOG.rh_4, HOG.rh_5\n" +
"from Campo_Vivienda_Marco VM \n" +
"left join Campo_Vivienda V \n" +
"	on VM.Conglome = V.Conglome and VM.Vivienda = V.Vivienda\n" +
"left join Campo_Conglomerado C \n" +
"	on VM.Conglome = C.Conglome\n" +
"left join \n" +
"	(select H.Conglome, H.Vivienda	\n" +
"	,MAX(CASE WHEN H.Hogar IN (1) THEN H.ResFin ELSE NULL END) AS rh_1\n" +
"	,MAX(CASE WHEN H.Hogar IN (2) THEN H.ResFin ELSE NULL END) AS rh_2\n" +
"	,MAX(CASE WHEN H.Hogar IN (3) THEN H.ResFin ELSE NULL END) AS rh_3\n" +
"	,MAX(CASE WHEN H.Hogar IN (4) THEN H.ResFin ELSE NULL END) AS rh_4\n" +
"	,MAX(CASE WHEN H.Hogar IN (5) THEN H.ResFin ELSE NULL END) AS rh_5\n" +
"	from Campo_Hogar H \n" +
"	group by H.Conglome, H.Vivienda \n" +
"	) HOG\n" +
"	on HOG.Conglome = VM.Conglome and HOG.Vivienda = VM.Vivienda	\n" +
sqlWhere+                    
"order by C.Odei, C.Mes, C.Periodo, C.Conglome\n" +
";";
            //Cronometro cr = new Cronometro();
            //cr.iniciar();
                        
            ResultSet rs = st.executeQuery(sql);                
            
            //System.out.println("TIEMPO1="+cr.medirEnMiliSegundos());
            
            SesionImpl<Vivienda> sesion = new SesionImpl<Vivienda>();
            
            while(rs.next()) {            
                
                Conglomerado c = new Conglomerado();
                
                Odei odei = listados.getOdei(rs.getString(1));
                c.setOdei(odei);
                
                Mes mes = listados.getMes(rs.getString(2));                        
                c.setMes(mes);
                
                Periodo p = listados.getPeriodo(rs.getString(3));
                c.setPeriodo(p);
                
                c.setCodigo(rs.getString(4));
                
                Vivienda v = new Vivienda();
                v.setConglomerado(c);
                
                CentroPoblado cp = new CentroPoblado();
                cp.setNombre(rs.getString(5));
                v.setCentroPoblado(cp);
                
                v.setCodigo(rs.getString(6));
                
                //////////
                v.setEsReemplazo(rs.getString(7));
                
                Vivienda vreemp = new Vivienda();
                vreemp.setConglomerado(c);//el reemplazo es del mismo conglomerado
                vreemp.setCodigo(rs.getString(8));
                //////////
                
                Vivienda vSesion = viviendaService.establecerViviendaReemplazada(sesion,v,vreemp);
                
                //esto sirve para las viviendas creadas con el objeto "vreemp" 
                // que no tienen atributos "centro poblado", ni "esReemplazo"
                vSesion.setCentroPoblado(v.getCentroPoblado());
                vSesion.setEsReemplazo(vreemp.getEsReemplazo());
                
               
                List<Hogar> lista = new ArrayList<Hogar>();
                
                Hogar h1 = new Hogar();
                h1.setResultadoFinal(rs.getString(9));
                lista.add(h1);
                
                Hogar h2 = new Hogar();
                h2.setResultadoFinal(rs.getString(10));
                lista.add(h2);
                
                Hogar h3 = new Hogar();
                h3.setResultadoFinal(rs.getString(11));
                lista.add(h3);
                
                Hogar h4 = new Hogar();
                h4.setResultadoFinal(rs.getString(12));
                lista.add(h4);
                
                Hogar h5 = new Hogar();
                h5.setResultadoFinal(rs.getString(13));
                lista.add(h5);
                
                vSesion.setHogares(lista);
                
                rep.addFila(vSesion);
            }
            
            //System.out.println("TIEMPO2="+cr.medirEnMiliSegundos());
                        
            /*
            //ESTO SE USA SI, NO SE USA UN OBJETO SESION:
            //Arreglando los reemplazos, es decir que no exista mas de un objeto 
            //que representen a la misma vivienda            
            
            //Se hace despues del while, porque las viviendas reemplazadas 
            //pueden estar antes o despues de una fila
            List<ViviendaReporte> filas = rep.getFilas();
            for(ViviendaReporte fila : filas) {
                if(fila.esReemplazo()) {
                    //Arreglando vivienda reemplazada
                    Vivienda vreemp = fila.getViviendaReemplazada();
                    Vivienda filaPasada = rep.getFila(vreemp);
                    if(filaPasada!=null) {
                        fila.setViviendaReemplazada(filaPasada);
                    }                    
                    
                    //Arreglando vivienda reemplazo
                    fila.getViviendaReemplazada().addViviendaReemplazo(fila);
                }
            }
            */
            
            //System.out.println("TIEMPO3="+cr.medirEnMiliSegundos());
        }
        finally {
            if(st!=null) st.close();
        } 
    }
   

    public List<ViviendaMarco> findViviendasMarcoParaGeoreferenciacion(
            Connection con,
            ListadosReporte listados,
            Conglomerado filtro
            ) throws SQLException {
        
        List<ViviendaMarco> lista = new ArrayList<ViviendaMarco>();
        
        Statement st = null;        
        try {                    
            st = con.createStatement();
            
            WhereSqlDinamico w = new WhereSqlDinamico();
            w.and("C.odei=",filtro.getOdei().getCodigo());
            w.and("C.conglome=",filtro.getCodigo());
                        
            String sql =
"select C.Odei, C.Mes, C.Periodo, C.Conglome, \n" +
"VM.NomCCPP, \n" +
"V.Vivienda, V.Latitud_GPS, V.Longitud_GPS \n" +
"from Campo_Vivienda_Marco VM \n" +
"inner join Campo_Vivienda V\n" +
"	on VM.Conglome = V.Conglome and VM.Vivienda = V.Vivienda\n" +
"inner join Campo_Conglomerado C \n" +
"	on VM.Conglome = C.Conglome\n" +
w.getSql()+                    
";";
            
            //System.out.println("SQL="+sql);            
            ResultSet rs = st.executeQuery(sql);         
            while(rs.next()) {
                Conglomerado c = new Conglomerado();
                
                //ODEI
                Odei odei = listados.getOdei(rs.getString(1));                                               
                c.setOdei(odei);
                
                //MES
                //Mes mes = listados.getMes(rs.getString(2));
                Mes mes = new Mes();
                mes.setNombre(rs.getString(2));
                c.setMes(mes);
                
                //PERIODO
                //Periodo periodo = listados.getPeriodo(rs.getString(3));
                Periodo periodo = new Periodo();
                periodo.setNombre(rs.getString(3));
                c.setPeriodo(periodo);
                
                c.setCodigo(rs.getString(4));
                
                CentroPoblado cp = new CentroPoblado();
                cp.setNombre(rs.getString(5));
                
                Vivienda vc = new Vivienda();
                vc.setCodigo(rs.getString(6));
                vc.setConglomerado(c);
                //AGREGAR LISTA DE ENCUESTADORES
                List<Hogar> hogares = hogarService.findHogaresConEncuestadoresDistintosByVivienda(con, vc);
                vc.setHogares(hogares);
                
                CoordenadaGeografica co = new CoordenadaGeografica();
                co.setLatitud(rs.getString(7));
                co.setLongitud(rs.getString(8));
                vc.setCoordenadaGPS(co);           
                
                ViviendaMarco vm = new ViviendaMarco();
                vm.setCentroPoblado(cp);
                vm.setConglomerado(c);
                vm.setViviendaCampo(vc);                
                
                lista.add(vm);
            }
        }
        finally {
            if(st!=null) st.close();
        }
        
        return lista;
    }

    public ViviendaService getViviendaService() {
        return viviendaService;
    }

    public void setViviendaService(ViviendaService viviendaService) {
        this.viviendaService = viviendaService;
    }
    
    public HogarService getHogarService() {
        return hogarService;
    }

    public void setHogarService(HogarService hogarService) {
        this.hogarService = hogarService;
    }    
}
